package main

import "fmt"

/*
如果有些情况，必须要处理异常，就需要使用panic，抛出了异常，recover，接收这个异常来处理。
假设：手动给一个值设定了大小区间 （0-500） i++   499  panic， 有人给我处理这个panic
*/
// panic  recover
//
// 出现了panic之后，如果有defer语句，先执行所有的defer语句。
//
// defer : 延迟函数，倒序执行，处理一些问题。
func main() {
	defer fmt.Println("main--1")
	defer fmt.Println("main--2")
	fmt.Println("main--3")
	testPanic(1) // 外部函数，也不会继续再向下执行了
	defer fmt.Println("main--4")
	fmt.Println("main--5")
}
func testPanic(num int) {
	defer fmt.Println("testPanic--1")
	defer fmt.Println("testPanic--2")
	fmt.Println("testPanic--3")
	// 如果在函数中一旦触发了 panic，会终止后面要执行的代码。
	// 如果存在defer，正常按照defer逻辑执行
	if num == 1 {
		panic("出现预定的异常----panic")
	}
	defer fmt.Println("testPanic--4")
	fmt.Println("testPanic--5")
}

//只要发生了panic，那么不管是这个函数内部panic之后的语句都会进行停止
//并且不管只要执行了内部有panic的函数，那么这个函数所在后的语句不会进行执行

/*
执行逻辑：
1、panic 触发
2、触发panic当前函数的所有defer语句，倒序执行
3、直到遇到recover处理了这个panic..函数结束
4、main，继续向下执行。

*/
